//给定一个整数，写一个函数来判断它是否是 3 的幂次方。如果是，返回 true ；否则，返回 false 。 
//
// 整数 n 是 3 的幂次方需满足：存在整数 x 使得 n == 3x 
//
// 
//
// 示例 1： 
//
// 
//输入：n = 27
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：n = 0
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：n = 9
//输出：true
// 
//
// 示例 4： 
//
// 
//输入：n = 45
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// -231 <= n <= 231 - 1 
// 
//
// 
//
// 进阶：你能不使用循环或者递归来完成本题吗？ 
// Related Topics 递归 数学 
// 👍 237 👎 0

package com.cute.leetcode.editor.cn;
public class PowerOfThree {
    public static void main(String[] args) {
        Solution solution = new PowerOfThree().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 朴素算法，注意while的判断条件，只有当n%3==0时才能进行
         */
        public boolean isPowerOfThree(int n) {
            if (n<=0) return false;
            while (n%3==0) n/=3;
            return n==1;
        }

        /**
         * 倍数-约数方法
         * 仅限于3的x次方
         * 参数的类型是int，在int范围内3的最高次幂结果为1162261467
         * 所以只需要将n与1162261467判断是否存在倍数关系即可了
         *
         * 另一个方法：打表，将int范围中的所有3的x次方的数都记录下来，然后直接查找
         */
        public boolean isPowerOfThree2(int n) {
            return n > 0 && 1162261467 % n == 0;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}